【Kotlin/Android Studio】現在の日付を取得する方法!DateTimeFormatterの使い方

この記事からわかること
- Android Studio/Kotlinで現在の日付情報を取得する方法
- DateTimeFormatterの使い方
- yyyy/mm/dd形式の種類
- 日付→文字列、文字列→日付(Date型)への変換
- 日本時間や元号を取得するには?
- Calendarクラスの使い方
index
[open]
\ アプリをリリースしました /
環境
- Android Studio:Flamingo
- Kotlin:1.8.20
現在の日付を取得する方法
Kotlinでは現在の日付や時間を取得するクラスがいくつか定義されています。それぞれに役割は異なりますがnow
メソッドから取得できる点は変わりません。
- Date:java.util.DateクラスをKotlinでラップした特定のタイムゾーンに依存しない絶対時間
- LocalDate:ISO-8601暦法の日付情報
- LocalDateTime:ISO-8601暦法の日付と時間情報
- JapaneseDate:日本の暦法の日付情報
- ZonedDateTime:指定したゾーンの日付と時間情報
LocalDateTimeで9時間のズレが生じる原因
LocalDateTime
クラスで時間まで取得した場合print
した時刻(9時でした)とオブジェクトの時刻では0時とAM 9時で日時情報には誤差が生まれています。これはUTC(協定世界時)で日時情報を保持しているためであり、UTCと日本標準時(JTC)とは9時間ズレているため誤差が生まれてしまうのです。
文字列として出力するフォーマットを指定
先ほどはデフォルトの形式のまま出力されていましたが、DateTimeFormatter
クラスを使用することで任意の形式の文字列に変更することができます。フォーマットパターンはofPattern
の引数に文字列で渡します。
表示されている日付情報が/
区切りに変更になったことを確認できました。間の区切り文字に指定はないので日本語の年月日を指定することも可能です。
日本時間で取得する
フォーマットパターンの種類
yyyy/MM/dd
などのフォーマットはあらかじめ指定されたシンボルを使用します。以下に公式サイトに載っていたものを抜粋したので参考にしてください。
Symbol | 意味 | Examples |
---|---|---|
G | 元号 | 西暦; Anno Domini; A |
u | 年 | 2004; 04 |
y | 元号の年 | 2004; 04 |
D | 年内通算日 | 189 |
M/L | 年内月 | 7; 07; 7月; 7月; J |
d | 月内通算日 | 10 |
g | 修正ユリウス日 | 2451334 |
Q/q | 四半期 | 3; 03; 第3四半期; 3rd quarter |
Y | 週ベースの年 | 1996; 96 |
w | 週ベースの年内週 | 27 |
W | 月内週 | 4 |
E | 曜日 | 火; 火曜日; 火 |
e/c | ローカライズされた曜日 | 2; 02; 火; 火曜日; 火 |
F | 月内曜日番号 | 3 |
a | 午前/午後 | 午後 |
h | 午前/午後の時 (1-12) | 12 |
K | 午前/午後の時 (0-11) | 0 |
k | 1日の時 (1-24) | 24 |
H | 1日の時 (0-23) | 0 |
m | 分 | 30 |
s | 秒 | 55 |
S | 秒以下の小数部分 | 978 |
A | 1日のミリ秒 | 1234 |
n | 秒以下のナノ秒 | 987654321 |
N | 1日のナノ秒 | 1234000000 |
参考文献:公式:DateTimeFormatter
文字列からDate型への変換
「日付→文字列」ではなく「文字列→日付」へ変換したい場合はLocalDate
のparse
メソッドを使用します。引数には変換対象の文字列とそのフォーマットにあったDateTimeFormatter
を渡します。
DateTimeFormatter
のparse
メソッドでも変換はできるようですがデータ型がParsed
になるようです。
文字列から時間込みのDate型への変換
時間も含めてパースしたい場合はLocalDateTime
を使用します。
SimpleDateFormatでも日付の変換が可能
元号を取得する
元号を取得したい場合はJapaneseDate
で取得したオブジェクトのera
プロパティから取得することが可能です。そのままではローマ字なのでgetDisplayName
メソッドの引数に表示するスタイルとロケールを指定すれば日本語で表示させることも可能です。
スタイルは以下の通りですがFULL
とSHORT
は日本の場合同じなのでFULL
だけ使用すれば良さそうです。
定数 | 出力例 |
---|---|
FULL |
令和 |
FULL_STANDALONE |
令和 |
NARROW |
R |
NARROW_STANDALONE |
R |
SHORT |
令和 |
SHORT_STANDALONE |
令和 |
元号n年形式で取得する
元号のみではなく「元号n年」形式で取得したい場合のが多いと思います。これはDateTimeFormatter
を使用してGy年
と指定することで取得することができます。
西暦になってしまう場合
和暦で表示させたい場合はJapaneseDate
オブジェクトに変換させる必要があります。これをしないと西暦で表示されてしまうので以下のように文字列から和暦のみを抽出したい場合は変換を繰り返して実装することになります。
日付を引き算/足し算して⚪︎日前/後を取得する
日付を引き算/足し算して⚪︎日前/後を取得するにはminusDays
メソッドまたはplusDays
メソッドを使用します。
Calendarクラスから日時を1つずつ取得する
Calendar
クラスを使用することで日時情報を1つ1つ取得することが可能です。ですが月のみ1ヶ月少ない数値が返ってくるので+1
することで実際の月に合わせます。これは1月=0
、2月=1
という感じになっているからのようです。
UNIX形式のタイムスタンプを取得する
time
プロパティから自身の日付と1970年1月1日の00:00:00 UTCとの間隔(UNIX)をLong型のミリ秒数で取得できます。ミリ秒数なので秒単位で取得したい場合は1000
でわる必要があります。
UNIX形式のタイムスタンプをDate型に戻す
UNIX形式のタイムスタンプ値はDate型に簡単に戻すことが可能です。この際にちゃんとミリ秒単位でLong型のタイムスタンプでないと正しく変換できないので注意してください。
まだまだ勉強中ですので間違っている点や至らぬ点がありましたら教えていただけると助かります。
ご覧いただきありがとうございました。